Skip to content

grep -v -f file and rg -v -f file differ #3001

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
BurntSushi opened this issue Feb 26, 2025 · 0 comments
Open

grep -v -f file and rg -v -f file differ #3001

BurntSushi opened this issue Feb 26, 2025 · 0 comments
Labels
bug A bug.

Comments

@BurntSushi
Copy link
Owner

While I don't maintain any guarantees with grep specifically, it was my intent to match its behavior here. Moreover, ripgrep's behavior is internally inconsistent:

$ echo wat | rg -f /dev/null
$ echo wat | rg -v -f /dev/null
$ echo wat | grep -f /dev/null
$ echo wat | grep -v -f /dev/null
wat
$ echo wat | rg -f <(echo)
wat
$ echo wat | rg -v -f <(echo)
$ echo wat | grep -f <(echo)
wat
$ echo wat | grep -v -f <(echo)
$

Specifically, the fact that the first two commands above both report no results is wrong.

Discussed in #3000

Originally posted by datatraveller1 February 26, 2025
I want to list all found values from a search and all not found values from a search.
The following is a simplified example. The values searched for are listed in the file search_for.txt.

search_for.txt:

1
2
3

The file in which these values are searched is named searched_in.txt.

searched_in.txt:

item 1
item 2

I use the following commands (note that I'm on MS Windows):

find entries of file search_for.txt:

rg --file=search_for.txt --only-matching searched_in.txt > found.txt

not found entries of file search_for.txt:

rg --invert-match --file=found.txt search_for.txt > not_found.txt

The result is correct:

found.txt:

1
2

not_found.txt:

3

Great so far.
However, if I change the content of file search_for.txt so nothing is found...
search_for.txt:

4
5
6

... with the two above commands, the file found.txt gets created as a 0 bytes file (which is correct, because nothing is found) but the file not_found.txt gets also created as a 0 bytes file which doesn't match my expectations.
I have wished to see all values of file search_for.txt as result for the command
rg --invert-match --file=found.txt search_for.txt > not_found.txt
not_found.txt, wished result:

4
5
6

Isn't the inversion of nothing everything?
If this is the expected behaviour, is there a special flag to achieve what I want for --file and 0 bytes content of this file?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug A bug.
Projects
None yet
Development

No branches or pull requests

1 participant